package Day_0225.SpringAOP;

/**
 * @author zxc
 * @date 2023/02/25 11:40
 **/
public class SpringAOP_AspectJAOP {
    public static void main(String[] args) {
        /**
         * Spring AOP and AspectJ AOP 之间的区别 && AOP 实现方式
         * ===》
         * 1.AOP实现的关键在于 代理模式，AOP代理主要分为静态代理和动态代理。
         * （1）静态代理，代表为AspectJ；
         * （2）动态代理，以Spring AOP为代表。
         *
         * 2.AspectJ
         * （1）是静态代理的增强，所谓静态代理，就是AOP框架会在编译阶段生成AOP代理类，因此也称为编译时增强，
         * （2）其会在编译阶段将AspectJ(切面)织入到Java字节码中，运行的时候就是，增强之后的AOP对象。
         *
         * 3.Spring AOP
         * （1）Spring AOP使用的动态代理，
         * （2）所谓的动态代理，就是说AOP框架不会去修改字节码，而是每次运行时，在内存中临时为方法生成一个AOP对象，
         *  这个AOP对象包含了目标对象的全部方法，并且在特定的切点做了增强处理，并回调原对象的方法。
         *
         * 4.JDK动态代理和CGLIB动态代理的区别
         * 1）Spring AOP中的动态代理主要有两种方式，
         * （1）JDK动态代理
         * （2）CGLIB动态代理：
         *
         * 2）JDK动态代理
         * （1）只提供接口的代理，不支持类的代理。
         * （2）核心InvocationHandler接口和Proxy类，
         *  InvocationHandler 通过invoke()方法反射，来调用目标类中的代码，动态地将横切逻辑和业务编织在一起；
         *  接着，Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
         *
         * 3）CGLIB动态代理
         * （1）如果代理类没有实现 InvocationHandler 接口，那么Spring AOP会选择使用CGLIB来动态代理目标类。
         * （2）CGLIB（Code Generation Library），是一个代码生成的类库，
         *  可以在运行时动态地生成指定类的一个子类对象，并覆盖其中特定方法并添加增强代码，从而实现AOP。
         * （3）CGLIB是通过继承的方式做的动态代理，因此如果某个类被标记为final，那么它是无法使用CGLIB做动态代理的。
         *
         * ===》
         * 4）静态代理和动态代理之间的区别
         * （1）静态代理与动态代理区别在于，生成AOP代理对象的时机不同，
         * （2）相对来说AspectJ的静态代理方式具有更好的性能，但是AspectJ需要特定的编译器进行处理，而Spring AOP则无需特定的编译器处理。
         *
         */
    }
}
